﻿using Dao;
using Interface.BO;
using Interface.DAO;
using JMI_Nucleo.Classe;
using JMI_Nucleo.JMIProvider;
using OR;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.IO;
using System.Xml;

namespace BO
{
    public class Empresa : IEmpresa
    {
        #region Classe para controle do TempXML Empresa
        public class XMLEmpresa
        {
            private static int _codigo;

            public static int Codigo
            {
                get { return _codigo; }
                set { _codigo = value; }
            }

            public static short GetCodigoEmpresa()
            {
                if (!ExiteXMLTemp())
                    GravaXML();

                short codigo = 1;
                
                string nomeArquivo = Path.Combine(Environment.CurrentDirectory, "TempXML.xml");

                if (File.Exists(nomeArquivo))
                {
                    XmlTextReader leitor = new XmlTextReader(nomeArquivo);

                    while (leitor.Read())
                    {
                        //verificacao do tipo de nó lido
                        if (leitor.NodeType == XmlNodeType.Text)
                            codigo = Convert.ToInt16(leitor.Value);
                    }
                    //fechamento do arquivo XML
                    leitor.Close();
                }
                return codigo;
            }  
    
            public static void GravaXML()
            {
                if (Codigo == 0) { return; }
                string nomeArquivo = Path.Combine(Environment.CurrentDirectory, "TempXML.xml");
               //abrindo (ou criando) o documento XML para escrita
               XmlTextWriter escritor = new XmlTextWriter(nomeArquivo, System.Text.Encoding.UTF8);

	           //comando de formatacao do documento (indentacao)
               escritor.Formatting = Formatting.Indented;

               //iniciando o documento
               escritor.WriteStartDocument();

               escritor.WriteStartElement("InfoEmpresa");

               escritor.WriteStartElement("Dados");
               escritor.WriteElementString("codigoempresa", Codigo.ToString());

               escritor.WriteEndElement();
            
                //fechando o elemento raiz
                escritor.WriteEndElement();

                //fechando o documento
                escritor.WriteEndDocument();

                escritor.Close();    
            }

            public static bool ExiteXMLTemp()
            {
                bool existe = false;

                string nomeArquivo = Path.Combine(Environment.CurrentDirectory, "TempXML.xml");
                if (File.Exists(nomeArquivo))
                    existe = true;
                return existe;
            }
        }
        #endregion

        private string msgErro;
        private IEmpresaDao<mEmpresa> dao;        

        public string MsgErro { get { return msgErro; } }

        public Empresa()
        {
            dao = DaoFactory<EmpresaDao>.Create();
        }

        private bool Valida(mEmpresa _mEmpresa)
        {
            bool retorno = true;
            JMIUtil util = new JMIUtil();

            if (_mEmpresa.Pessoa.Nome == String.Empty)
            {
                msgErro = "Razão Social, Campo Obrigatório.";
                retorno = false;
            }
            if (String.IsNullOrEmpty(_mEmpresa.Pessoa.CNPJ))
            {
                msgErro = "CNPJ, Campo Obrigatório.";
                retorno = false;
            }
            else
            {
                if (!util.CnpjValido(_mEmpresa.Pessoa.CNPJ))
                {
                    msgErro = "CNPJ inválido.";
                    retorno = false;
                }            
            }
            if (String.IsNullOrEmpty(_mEmpresa.Pessoa.IE))
            {
                msgErro = "Inscrição Estadual, Campo Obrigatório.";
                retorno = false;
            }
            else
            {
                if (!util.InscEstadualValida(_mEmpresa.Pessoa.IE, _mEmpresa.UFInscEstadual))
                {
                    msgErro = "Inscrição Estadual inválida.";
                    retorno = false;
                }        
            }
            if (!String.IsNullOrEmpty(_mEmpresa.Contato.Email1))
            {
                if (!util.IsValidaEmail(_mEmpresa.Contato.Email1))
                {
                    msgErro = "Primeiro E-mail inválido.";
                    retorno = false;
                }
            }
            if (!String.IsNullOrEmpty(_mEmpresa.Contato.Email2))
            {
                if (!util.IsValidaEmail(_mEmpresa.Contato.Email2))
                {
                    msgErro = "Segundo E-mail inválido.";
                    retorno = false;
                }
            }
            
            return retorno;
        }
        public List<mEmpresa> GetLista()
        {
            List<mEmpresa> lstEmpresa;

            try
            {
                EngineBD.Conectar();
                lstEmpresa = dao.GetListEmpresa();
            }
            finally
            {
                EngineBD.Desconectar();
            }
            return lstEmpresa;
        }

        public List<mEmpresa> GetListaPorFiltro(mEmpresa infoEmpresa)
        {
            List<mEmpresa> lstEmpresa;

            try
            {
                EngineBD.Conectar();
                lstEmpresa = dao.GetListaPorFiltro(infoEmpresa);
            }
            finally
            {
                EngineBD.Desconectar();
            }
            return lstEmpresa;
        }

        public bool Salvar(mEmpresa infoEmpresa, char Acao, int Codigo = 0)
        {
            bool retorno = false;
            DbTransaction trans;

            try
            {
                EngineBD.Conectar();
                trans = EngineBD.IniciaTransacao();

                if (Valida(infoEmpresa))
                {
                    if (Acao == 'I')
                    {
                        infoEmpresa.Codigo = (short)UtilBD.GetID(EngineBD.GetConexao, "cadastro.empresa", "codigo", 0);
                        retorno = dao.Inserir(infoEmpresa);
                    }
                    else if (Acao == 'A')
                        retorno = dao.Alterar(infoEmpresa);
                    retorno = EngineBD.FinalizaTransacao(trans, retorno);
                }
            }
            catch (Exception exc)
            {
                retorno = false;
                msgErro = "Falha na gravação dos dados, " + exc.Message;
            }
            finally
            {
                EngineBD.Desconectar();
            }
            return retorno;
        }
        public bool Excluir(mEmpresa infoEmpresa)
        {
            bool retorno = false;
            DbTransaction trans;
            try
            {
                EngineBD.Conectar();
                trans = EngineBD.IniciaTransacao();
                retorno = dao.Excluir(infoEmpresa);
                EngineBD.FinalizaTransacao(trans, retorno);
            }
            finally
            {
                EngineBD.Desconectar();
            }
            return retorno;
        }
        public bool ExisteCadastro()
        {
            bool existe = false;

            try
            {
                EngineBD.Conectar();
                existe = dao.ExisteCadastro();
            }
            finally
            {
                EngineBD.Desconectar();
            }
            return existe;
        }
        public short GetCodigo(string Apelido)
        {
            short codigo = 0;

            try
            {
                EngineBD.Conectar();
                codigo = dao.GetCodigo(Apelido);
            }
            finally
            {
                EngineBD.Desconectar();
            }
            return codigo;
        }
        public string GetApelido(int Codigo)
        {
            string apelido = String.Empty;

            try
            {
                EngineBD.Conectar();
                apelido = dao.GetApelido(Codigo);
            }
            finally
            {
                EngineBD.Desconectar();
            }
            return apelido;
        }
        public mEmpresa GetEmpresa(int Codigo)
        {
            mEmpresa _mEmpresa;

            try
            {
                EngineBD.Conectar();
                _mEmpresa = dao.GetEmpresa(Codigo);
            }
            finally
            {
                EngineBD.Desconectar();
            }
            return _mEmpresa;
        }
        public mEmpresa GetEmpresaPorCNPJ(string CNPJ)
        {
            mEmpresa _mEmpresa;

            try
            {
                EngineBD.Conectar();
                _mEmpresa = dao.GetEmpresaPorCNPJ(CNPJ); 
            }
            finally
            {
                EngineBD.Desconectar();
            }
            return _mEmpresa;
        }
    }
}
